package com.example.demo.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.example.demo.domain.Person;
import com.example.demo.service.PersonService;
import com.example.demo.utils.SpringContextUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;

import java.util.ArrayList;
import java.util.List;

@Slf4j
public class ExcelStudentDataListener extends AnalysisEventListener<Person> {


    private static PersonService personService;

    static {
//        SpringApplication.run(DemoApplication.class); //这个启动项目在单元测试可以需要带上，但是也可以不用这个启动，直接去掉，通过run主程序启动
        ApplicationContext applicationContext = SpringContextUtil.getApplicationContext();
        personService = applicationContext.getBean(PersonService.class);
    }

    /**
     * 批量读取时忽略
     */
    private static final int BATCH_COUNT = 1000;
    List<Person> list = new ArrayList<>();
    /**
     * 遍历每一行的记录
     * @param data
     * @param context
     */
    @Override
    public void invoke(Person data, AnalysisContext context) {
        list.add(data);
        if(list.size() >= BATCH_COUNT){
            // TODO 存储数据库的操作
            log.info("存储数据库，并清理内存");
            list.clear();
        }

    }
    /**
     * 所有数据读取之后的收尾工作
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {



        personService.list();
        //实现批量插入数据库，但是需要注意主键重复的问题
        for (Person person : list) {
            personService.save(person);
        }



        log.info("存储剩余数据");
        log.info("全部数据解析完成");

    }
}